package br.fatec.ads.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.fatec.ads.connection.DataSource;
import br.fatec.ads.exception.DataBaseException;
import br.fatec.ads.exception.VagaException;
import br.fatec.ads.exception.VagaPerguntaException;
import br.fatec.ads.model.Pergunta;
import br.fatec.ads.model.ProcessoSeletivo;
import br.fatec.ads.model.Vaga;
import br.fatec.ads.model.VagaPergunta;

/**
 * Classe intermediaria entre o modelo e o banco de dados 
 */
public class VagaPerguntaDAO {
	private static VagaPerguntaDAO vagaPerguntaDAO;
	private static String INCLUIR_VAGA_PERGUNTA = "EXEC P_VAGA_PERGUNTA_INCLUIR ?, ?, ?";
	private static String EXCLUIR_VAGA_PERGUNTA = "EXEC P_VAGA_PERGUNTA_EXCLUIR ?";
	private static String LISTAR_VAGA_PERGUNTA = "EXEC P_VAGA_PERGUNTA_LISTAR ?, ?";
	
	public VagaPerguntaDAO() {
		super();
	}
	
	public static VagaPerguntaDAO getInstance(){
		if(vagaPerguntaDAO == null){
			vagaPerguntaDAO = new VagaPerguntaDAO();
		}
		
		return vagaPerguntaDAO;
	}
	
    public void incluirVagaPergunta(VagaPergunta vagaPergunta) throws VagaPerguntaException, DataBaseException{
        Connection connection = null;
        PreparedStatement query = null;

        try{
            try{
                connection = DataSource.getConnection();
                query = connection.prepareStatement(INCLUIR_VAGA_PERGUNTA);

                int i = 0;
                query.setInt(++i, vagaPergunta.getVaga().getIdVaga());
                query.setInt(++i, vagaPergunta.getPergunta().getIdPergunta());
                query.setString(++i, vagaPergunta.getUsuario());
                
                query.executeUpdate();
            }catch(SQLException cause){
                throw new VagaPerguntaException("Problemas ao INSERIR a Vaga Pergunta!", cause);
            }finally{
                DataSource.close(connection);
                DataSource.close(query);
            }
        } catch(DataBaseException cause){
            throw new DataBaseException(cause);
        }
    }
    
    public void excluirVagaPergunta(VagaPergunta vagaPergunta) throws VagaPerguntaException, DataBaseException{
        Connection connection = null;
        PreparedStatement query = null;

        try{
            try{
                connection = DataSource.getConnection();
                query = connection.prepareStatement(EXCLUIR_VAGA_PERGUNTA);

                int i = 0;
                query.setInt(++i, vagaPergunta.getIdVagaPergunta());

                query.executeUpdate();
            }catch(SQLException cause){
                throw new VagaPerguntaException("Problemas ao EXCLUIR a Vaga Pergunta!", cause);
            }finally{
                DataSource.close(connection);
                DataSource.close(query);
            }
        }catch(DataBaseException cause){
            throw new DataBaseException(cause);
        }
    }
    
    public List listarVagaPergunta(VagaPergunta vagaPergunta) throws VagaPerguntaException, DataBaseException{
    	Connection connection = null;
    	PreparedStatement query = null;
    	ResultSet resultSet = null;
    	List listaVagaPergunta = new ArrayList();
    	
    	try{
    		try{
    			connection = DataSource.getConnection();
    			query = connection.prepareStatement(LISTAR_VAGA_PERGUNTA);
    			
    			int i = 0;
    			query.setInt(++i, vagaPergunta.getVaga().getIdVaga());
    			query.setInt(++i, vagaPergunta.getPergunta().getIdPergunta());
    			
    			resultSet = query.executeQuery();
    			
    			while(resultSet.next()){
    				VagaPergunta vgPerg= new VagaPergunta();
    				
    				Pergunta pergunta = new Pergunta();
    				pergunta.setIdPergunta(resultSet.getInt("IDPERGUNTA"));
    				pergunta.setDescPergunta(resultSet.getString("DESCPERGUNTA"));
    				pergunta.setTipoPergunta(resultSet.getString("TIPOPERGUNTA"));
    				pergunta.setObrigatorio(resultSet.getString("OBRIGATORIO"));
    				
    				ProcessoSeletivo processoSeletivo = new ProcessoSeletivo();
    				processoSeletivo.setIdProcessoSeletivo(resultSet.getInt("IDPROCESSOSELETIVO"));
    				processoSeletivo.setNomeProcessoSeletivo(resultSet.getString("NOMEPROCESSOSELETIVO"));

    				Vaga vaga = new Vaga();
    				vaga.setProcessoSeletivo(processoSeletivo);
    				vaga.setIdVaga(resultSet.getInt("IDVAGA"));
    				vaga.setCargoVaga(resultSet.getString("CARGOVAGA"));
    				vaga.setDescVaga(resultSet.getString("DESCVAGA"));
    				
    				vgPerg.setIdVagaPergunta(resultSet.getInt("IDVAGAPERGUNTA"));
    				vgPerg.setVaga(vaga);
    				vgPerg.setPergunta(pergunta);
    				vgPerg.setDataHora(resultSet.getTimestamp("DTHRINCLUSAO"));
    				vgPerg.setUsuario(resultSet.getString("USUARIOINCLUSAO"));
    				
    				listaVagaPergunta.add(vgPerg);
    			}
    		}catch (SQLException cause) {
    			throw new VagaPerguntaException("Problemas ao LISTAR a Vaga Pergunta!", cause);
			}finally{
				DataSource.close(connection);
				DataSource.close(query);
				DataSource.close(resultSet);
			}
    	}catch (DataBaseException cause) {
    		throw new DataBaseException(cause);
		}
    	
    	return listaVagaPergunta;
    }
}